import QQMapWX from 'qqmap-wx-jssdk';
import { reverseGeocoder as mapUtilsReverseGeocoder } from '@/utils/mapUtils';

export default {
  // 添加props定义接收父组件参数
  props: {
    latitude: {
      type: Number,
      required: true,
      default: 0
    },
    longitude: {
      type: Number,
      required: true,
      default: 0
    },
    markers: {
      type: Array,
      required: true
    },
    scale: {
      type: Number,
      default: 16, // 添加默认值
      required: false
    },
    showLocation: {
      type: Boolean,
      default: false
    }
  },
  // 修正：watch应与data、methods同级
  watch: {
    // 监听经纬度变化并移动地图
    latitude: function(newVal) {
      if (newVal !== null && !isNaN(newVal)) {
        this.updateMapCenter();
      }
    },
    longitude: function(newVal) {
      if (newVal !== null && !isNaN(newVal)) {
        this.updateMapCenter();
      }
    }
  },
  // 修正：data应放在watch外面
  data() {
    return {
      // 删除 scale: 14,
      qqmapsdk: null,
      markerId: 1,
      sdkInitialized: false,
      sdkError: null,
      mapReady: false,
      mapContext: null,
      // 添加暂存经纬度变量
      tempLatitude: null,
      tempLongitude: null
    };
  },
  // 修正：onLoad应放在watch外面
  onLoad() {
    this.initMapSDK();
  },
  // 修正：methods应放在watch外面
  methods: {
    async initMapSDK() {
      try {
        // 1. 检查依赖是否加载
        if (typeof QQMapWX === 'undefined') {
          throw new Error('QQMapWX 依赖未加载，请检查 npm 包是否安装');
        }

        // 2. 初始化 SDK
        this.qqmapsdk = new QQMapWX({
          key: '5GABZ-VA56B-JMMUJ-NES7G-7CPG5-6EBFG'
        });

        // 3. 验证初始化结果
        if (!this.qqmapsdk || typeof this.qqmapsdk.reverseGeocoder !== 'function') {
          throw new Error('SDK 初始化返回无效对象');
        }

        this.sdkInitialized = true;
        this.sdkError = null;
        console.log('腾讯地图 SDK 初始化成功');
        this.getLocation(); // SDK 就绪后再获取位置
      } catch (err) {
        this.sdkInitialized = false;
        this.sdkError = err.message;
        console.error('SDK 初始化失败:', err.message);
        uni.showToast({
          title: '地图服务初始化失败',
          icon: 'error',
          duration: 3000
        });
      }
    },
    // 确保updateMapCenter方法在methods内
    onMapReady() {
      // 地图初始化完成后获取上下文
      this.mapContext = uni.createMapContext('mapContext', this);
      this.mapReady = true;
      // 初始化完成后立即更新一次位置
      this.updateMapCenter();
    },
    updateMapCenter() {
      // 确保地图已就绪且经纬度有效
      if (!this.mapReady || isNaN(this.latitude) || isNaN(this.longitude)) {
        console.warn('地图未就绪或经纬度无效，无法更新中心');
        return;
      }
      
      // 使用缓存的地图上下文
      if (this.mapContext) {
        this.mapContext.moveToLocation({
          latitude: this.latitude,
          longitude: this.longitude,
          duration: 1000,
          success: () => {
            console.log('地图中心已更新到:', this.latitude, this.longitude);
          },
          fail: (err) => {
            // 添加详细错误信息
            console.error('地图移动失败:', JSON.stringify(err));
          }
        });
      } else {
        console.error('地图上下文未初始化');
      }
    },
    getLocation() {
      uni.getLocation({
        type: 'gcj02',
        success: (res) => {
          // 创建新的标记数组
          const newMarkers = [{
            id: 1,
            latitude: res.latitude,
            longitude: res.longitude,
            title: '我的位置',
            width: 30,
            height: 30
          }];
          // 发射事件通知父组件更新
          this.$emit('location-updated', {
            latitude: res.latitude,
            longitude: res.longitude,
            markers: newMarkers
          });
          // 逆地址解析 
          this.reverseGeocoder(res.latitude, res.longitude);
        }
      });
    },
    // 移除重复的reverseGeocoder方法，使用带回调参数的版本
    

    // 添加事件发射方法
    emitMarkerTap(e) {
      const markerId = e.markerId;
      const marker = this.markers.find(m => m.id === markerId);
      if (marker && marker.address) {
        this.$emit('marker-tap', marker.address); // 发射地址信息
      }
    },

    addCustomMarker() {
      this.markerId++;
      const newMarker = {
        id: this.markerId,
        latitude: this.latitude + (Math.random() - 0.5) * 0.02,
        longitude: this.longitude + (Math.random() - 0.5) * 0.02,
        title: `标注点${this.markerId}`,
        iconPath: '/static/custom-marker.png',
        width: 30,
        height: 30,
        callout: {
          content: `标注点${this.markerId}`,
          color: '#ffffff',
          bgColor: '#1aad19',
          padding: 5,
          borderRadius: 4,
          display: 'ALWAYS'
        }
      };
      this.markers.push(newMarker);
    },

    onMarkerTap(e) {
      const markerId = e.markerId;
      uni.showToast({
        title: `点击了标注点${markerId}`,
        icon: 'none'
      });
    },
    // 处理地图空白区域点击
    handleMapTap(e) {
      // 1. 检查 SDK 是否初始化完成（增强版检查）
      if (!this.sdkInitialized || !this.qqmapsdk || typeof this.qqmapsdk.reverseGeocoder !== 'function') {
        console.error('地图 SDK 尚未初始化完成，无法解析地址');
        uni.showToast({
          title: '地图服务未就绪，请稍后重试',
          icon: 'error',
          duration: 2000
        });
        // 可选：尝试重新初始化SDK
        if (!this.sdkInitialized) {
          console.log('尝试重新初始化地图SDK...');
          this.initMapSDK();
        }
        return;
      }

      // 2. 获取点击位置经纬度
      const { latitude, longitude } = e.detail;
      if (!latitude || !longitude) {
        console.error('获取经纬度失败:', e.detail);
        uni.showToast({ title: '无法获取位置信息', icon: 'error' });
        return;
      }

      // 3. 安全调用逆地址解析
      this.reverseGeocoder(latitude, longitude, (address) => {
        this.$emit('map-tap', {
          latitude, longitude, address
        });
      });
    },
    // 使用统一的逆地址解析工具
    async reverseGeocoder(latitude, longitude, callback) {
      try {
        // 参数验证
        if (typeof latitude !== 'number' || typeof longitude !== 'number') {
          console.error('无效的经纬度参数:', latitude, longitude);
          callback && callback('位置信息无效');
          return;
        }

        // 使用mapUtils中的reverseGeocoder
        const result = await mapUtilsReverseGeocoder(latitude, longitude);
        const address = result?.address || '未知位置';
        callback && callback(address);
      } catch (error) {
        console.error('逆地址解析失败:', error);
        callback && callback('地址解析失败');
      }
    },
    
    // 添加地理编码方法（地址转经纬度）
    geocoder(address, callback) {
      if (!this.qqmapsdk || typeof this.qqmapsdk.geocoder !== 'function') {
        console.error('qqmapsdk未初始化或geocoder方法不存在');
        callback && callback(null);
        return;
      }

      this.qqmapsdk.geocoder({
        address: address,
        success: (res) => {
          if (res.result && res.result.location) {
            callback && callback(res.result.location);
          } else {
            callback && callback(null);
          }
        },
        fail: (err) => {
          console.error('地理编码失败:', err);
          callback && callback(null);
        }
      });
    },
    // 添加地址搜索定位方法
    searchLocation(address) {
      if (!address) return;

      this.geocoder(address, (location) => {
        if (location) {
          // 创建新的标记数组
          const newMarkers = [{
            id: 1,
            latitude: location.lat,
            longitude: location.lng,
            title: address,
            width: 30,
            height: 30
          }];
          // 发射事件通知父组件更新位置和标记
          this.$emit('location-updated', {
            latitude: location.lat,
            longitude: location.lng,
            markers: newMarkers
          });
        } else {
          uni.showToast({
            title: '未找到该地址，请重新输入',
            icon: 'error'
          });
        }
      });
    },
  }
}